package com.time.oss.adpater;

import com.time.oss.entity.FileInfo;
import com.time.oss.util.MinioUtil;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;

/**
 * minio的存储服务实现类
 *
 * @author: HuangQi
 * @date: Created in 22:43 2024/3/16
 * @description: minio的存储服务实现
 */
@Component
@RefreshScope
public class MinioStorageAdapter implements StorageAdapter {

    /**
     * minio工具类
     */
    @Resource
    private MinioUtil minioUtil;

    /**
     * minioUrl
     */
    @Value("${minio.url}")
    private String url;

    /**
     * 创建bucket桶
     *
     * @param bucketName 桶名称
     */
    @Override
    @SneakyThrows
    public void createBucket(String bucketName) {
        minioUtil.createBucket(bucketName);
    }

    /**
     * 上传文件
     *
     * @param uploadFile 文件流
     * @param bucketName 桶名称
     * @param objectName 命名文件名称
     */
    @Override
    @SneakyThrows
    public void uploadFile(MultipartFile uploadFile, String bucketName, String objectName) {
        minioUtil.createBucket(bucketName);
        if (objectName != null) {
            minioUtil.uploadFile(uploadFile.getInputStream(), bucketName, objectName + "/" + uploadFile.getOriginalFilename());
        } else {
            minioUtil.uploadFile(uploadFile.getInputStream(), bucketName, uploadFile.getName());
        }
    }

    /**
     * 列出所有桶
     *
     * @return 桶名称列表
     */
    @Override
    @SneakyThrows
    public List<String> getAllBucket() {
        return minioUtil.getAllBucket();
    }

    /**
     * 列出当前桶及文件
     *
     * @param bucketName
     * @return 文件列表
     */
    @Override
    @SneakyThrows
    public List<FileInfo> getAllFile(String bucketName) {
        return minioUtil.getAllFile(bucketName);
    }

    /**
     * 下载文件
     *
     * @param bucketName 桶名称
     * @param objectName 文件名称
     * @return 文件流
     */
    @Override
    @SneakyThrows
    public InputStream downloadFile(String bucketName, String objectName) {
        return minioUtil.downloadFile(bucketName, objectName);
    }

    /**
     * 删除桶
     *
     * @param bucketName 桶名称
     */
    @Override
    @SneakyThrows
    public void deleteBucket(String bucketName) {
        minioUtil.deleteBucket(bucketName);
    }

    /**
     * 删除文件
     *
     * @param bucketName 桶名称
     * @param objectName 文件名称
     */
    @Override
    @SneakyThrows
    public void deleteBucket(String bucketName, String objectName) {
        minioUtil.deleteObject(bucketName, objectName);
    }

    /**
     * 获取文件URL
     *
     * @param bucket     桶名称
     * @param objectName 文件名称
     * @return 文件URL
     */
    @Override
    @SneakyThrows
    public String getUrl(String bucket, String objectName) {
        return url + "/" + bucket + "/" + objectName;
    }
}
